# 函数中内部调用其他函数
"""
def student_inf():
    print("王长帅，防御，为延续")
def class_info():
    print("1609班有")
    student_inf() # 内部调用了student_inf()函数
class_info()
"""
# 函数内部调用自己，就是递归
"""
# 错误的案例，没有出口
def tell_story():
    print("从前有座山")
    print("上山有座庙")
    print("庙里有个老和尚")
    print("在给小和尚讲故事")
    print("讲的是什么呢?")
    tell_story() # 函数内部调用自己
tell_story()
"""
# 计算x开始到10以内的和
"""
def text1(i):
    if i==10:
        return 10
    else:
        return i+text1(i+1)
r = text1(1)
print(r) # 1+2+3+4+5+6+7+8+9+10 = 55
"""
# 计算X整数以内的和
"""
def sum2(x):
    if x > 1:
        value = x + sum2(x-1)
    else:
        value = 1 #出栈条件
    return value
print(sum2(5)) # 5+4+3+2+1
"""
# 匿名函数： 没有名字的函数  ,用于仅仅临时使用一次的场景,没有重复使用的需求
a = lambda x,y:x+y
# a就是这个lambda函数
# print(a(5, 6)) # 11
# 上面的匿名函数，等同于下面
def a1(x,y):
    return x+y
# print(a1) # <function a1 at 0x0188BE40> ，没加上括号，就不算调用函数

"""
salarics={
    'xiaolong3':300000,
    'xiaolong2':3000,
    'long1':1000,
}
# 返回最大薪资的人员姓名
print(max(salarics))  #xiaolong3

#定义函数，用于返回每一个人员的工资
def func(name):
    return salarics[name]

# 配合内置函数，通过value来获取最大的薪资
print(max(salarics,key=func))

# 配合匿名函数，获取最大薪资人员姓名

print(max(salarics,key = lambda name:salarics[name]))
# max中key参数，就是根据什么内容来返回最大值，name:salarics[name]
"""
# 根据员工表中的薪资进行排序
"""
s = [
    {'name':'龙仔','性别':'男','薪资':3000,'职位':'打工仔'},
    {'name':'曹賊','性别':'男','薪资':9000,'职位':'总经理'},
    {'name':'浩仔','性别':'男','薪资':8000,'职位':'副经理'},
    {'name':'雷子','性别':'男','薪资':5000,'职位':'督导'},
]
a2 = sorted(s,key = lambda s:s['薪资'],reverse=True)
print(a2)
"""
# 闭包函数
"""
def outer(): # 没有调用outer() 但是创造了outer这个函数
    # 1 只检测函数体的语法(工厂合不合格),不执行函数体代码(不使用工厂)
    print("外面的函数正在运行")
    def inner():
        print("里面的函数正在运行")
    # 3 返回inner函数的内存地址 想像成inner工厂的一把钥匙 由outer的物流return
    #  3.1但需要注意的是 这个不要写括号 我要的是返回这个函数而不是调用
    return inner 
# 2 执行了outer这个函数体代码,inner定义了
# inner = outer()#4 得到了里面的inner钥匙 取名字inner 包子肉拿出来
# inner()
# print(inner) # 这里输出的是 inner的内存地址 <function outer.<locals>.inner at 0x0154E108>
# 5 里面的inner钥匙加括号运行 inner这个函数
# inner()

# 一起使用 但不规范
# print(outer()())
"""
# 以下不是闭包
"""
def aa():
    print("我是aa")
    def bb():
        print("我是bb")
        return "我是bb"
    return bb()

# aa()
# 我是aa
# 我是bb
print(aa())
# 我是aa
# 我是bb
# 我是bb
"""

"""
def bb():
    print("搜索")
print(bb) # <function bb at 0x017BE198>
print(bb()) # 搜索
"""
# 装饰器
"""
def run():
    print("跑步")
    # 我想加一个健身 如果直接在这里添加就违背了装饰器的原则第一
def fitness():
    print("健身")
    run() # 这样就违背了装饰器的原则第二，  不修改被装饰器对象的调用方法(人的原来的外貌,名字)
"""
# 代码形式带入案例
"""
name = "长帅"
def run(name):
    print("我是%s"%name)
# run(name)
def decorate(func):
    def new_func(new_name):
        print("我是被装饰器前面的代码")
        func(new_name) # run(new_name)
        print("我是被装饰器后面的代码")
    return new_func # 拿到new_func的地址值
new_func = decorate(run)
print(new_func) # <function decorate.<locals>.new_func at 0x01F1E150>
new_func(name)
#我是被装饰器前面的代码
#我是长帅
#我是被装饰器后面的代码
"""
# 不是装饰器
"""
def eat():
    print("吃饭")
def funct(func):
    def aa():
        func() # eat()
    return aa
ab = funct(eat)# eat()
print(ab()) #　None
"""
"""
def aa():
    print("算是")
print(aa) # <function aa at 0x01D0E198>
print(aa())
"""
# 时间装饰器案例
from datetime import datetime
# 导入模块的几种方式
import random #导入random库下的全部方法
from random import randint # 导入random库下的randint方法，但是random其他方法用不了
# random.random()
# randint()
# 当前时间
# print(datetime.now())
# 时间装饰器
"""
n = 900000
def for1(n):
    sum = 0
    for i in range(1,n+1):
        # print(1)
        sum += i
    print(sum)
# for(n)
def run_time(func):# func是for1 这是一个用来计算程序执行时间的装饰器
    # print(func)
    def new_fonc(n):# for1(n) 的n
        start_time = datetime.now()
        print('开始时间%s'%start_time)
        func(n)
        end_time = datetime.now()
        print('结束时间%s'%end_time)
        time1 = end_time - start_time
        print('花费时间%s'%time1)
    return new_fonc
for1 = run_time(for1)
for1(n)
"""
# 简化装饰器
from datetime import datetime
print(datetime.now())
n = 900000
def run_time(func):# func是for1 这是一个用来计算程序执行时间的装饰器
    # print(func)
    def new_fonc(n):# for1(n) 的n
        start_time = datetime.now()
        print('开始时间%s'%start_time)
        func(n)
        end_time = datetime.now()
        print('结束时间%s'%end_time)
        time1 = end_time - start_time
        print('花费时间%s'%time1)
    return new_fonc

@run_time
def for1(n):
    sum = 0
    for i in range(1, n + 1):
        # print(1)
        sum += i
    print(sum)
for1(n)





